Hi.
Ich schreibe an meinem Programm das Mails empfangen und versenden soll.
Hierzu habe ich ein eigenständiges Tool geschrieben das im Hintergrundläuft.
2 Threads, einen zum Abholen der Mails und einen zum Senden der Mails.
Beide starte ich in einer Main Routine.
Wenn ich beide Threads starten lasse kommt es zu dieser Fehlermeldung:
Code:
Exception in thread "Thread-4" java.lang.SecurityException: Access to default session denied
Starte ich nur einen der beiden Threads dann gibt es keine Probleme.
Jetzt habe ich mir schon gedacht es könne an dem gleichzeitigen Zugriff liegen und habe deshalb ein Semaphor eingefügt. Aber das scheint nicht zu klappen denn wie mir das System out zeigt greifen die ineinander ein.
Thread 1:
PHP-Code:
import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.concurrent.Semaphore;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import DbConnection;
import MainFrame;
public class MailReaderThread extends Thread {
private Properties props = new Properties();
private String host = "";
private String username = "";
private String password = "";
private String provider = "pop3";
private int sleepInterval = 600000;
private MainFrame mainFrame = null;
private Semaphore semaphore = null;
public MailReaderThread(MainFrame mainFrame, Semaphore semaphore) {
this.mainFrame = mainFrame;
this.semaphore=semaphore;
}
private void workMessage(Message message) {
Object content;
try {
content = message.getContent();
if (content instanceof String) {
java.sql.Statement stmt;
try {
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
StringBuffer buffer = new StringBuffer("EXECUTE dbo.addMessage '");
buffer.append(content);
buffer.append("','");
buffer.append(df.format(new Date()));
buffer.append("'");
stmt = DbConnection.get().createStatement();
stmt.execute(buffer.toString());
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
public void run() {
while (!interrupted()) {
try {
if (semaphore!=null) semaphore.acquire();
System.out.println("Mailreader in");
try {
mainFrame.setMailReaderState(2);
// Update Mail Settings
// host="pop.kundenserver.de";//DbConnection.readProperty("syncronize_host");
host=DbConnection.readProperty("syncronize_host");
username=DbConnection.readProperty("syncronize_user");
password=DbConnection.readProperty("syncronize_password");
// Connect to the POP3 server
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore(provider);
store.connect(host, username, password);
// Open the folder
Folder inbox = store.getFolder("INBOX");
if (inbox == null) {
System.exit(1);
}
inbox.open(Folder.READ_WRITE);
// Get the messages from the server
Message[] messages = inbox.getMessages();
for (int i = 0; i < messages.length; i++) {
workMessage(messages[i]);
messages[i].setFlag( Flags.Flag.DELETED, true );
}
// Close the connection
inbox.close(true);
store.close();
} catch (NoSuchProviderException e1) {
e1.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
try {
sleepInterval = Integer.valueOf(DbConnection.readProperty("mailreader_sleep")).intValue();
} catch (Exception e) {
}
if (semaphore!=null) semaphore.release();
System.out.println("Mailreader out");
mainFrame.setMailReaderState(1);
Thread.sleep(sleepInterval);
} catch (InterruptedException e) {
mainFrame.setMessageWorkerState(0);
e.printStackTrace();
}
}
}
}
Thread 2:
PHP-Code:
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector;
import java.util.concurrent.Semaphore;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import DbConnection;
import MainFrame;
import SMTPAuth;
public class MailWriterThread extends Thread {
private int sleepInterval = 600000;
private MainFrame mainFrame = null;
private Semaphore semaphore = null;
public MailWriterThread(MainFrame mainFrame, Semaphore semaphore) {
this.mainFrame = mainFrame;
this.semaphore=semaphore;
}
@SuppressWarnings("unchecked")
public void run() {
while (!interrupted()) {
try {
mainFrame.setMailWriterState(2);
if (semaphore!=null) semaphore.acquire();
System.out.println("Mailwriter in");
try {
Properties props = new Properties();
props.put("mail.smtp.host", "auth.smtp.kundenserver.de");
// props.put("mail.smtp.host", DbConnection.readProperty("syncronize_host_smtp"));
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props,SMTPAuth.get());
session.setDebug(false);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(DbConnection.readProperty("syncronize_mail")));
ResultSet rs = DbConnection.get().createStatement().executeQuery("SELECT * FROM dbo.getRecipients('')");
Vector<String> buffer = new Vector();
while(rs.next()) buffer.add(rs.getString("mail"));
InternetAddress[] addressTo = new InternetAddress[buffer.size()];
for (int i = 0; i < buffer.size(); i+=1)
{
System.out.println(buffer.get(i));
addressTo[i] = new InternetAddress(buffer.get(i));
}
msg.setRecipients(Message.RecipientType.TO, addressTo);
msg.setSubject("1234");
msg.setContent("1234", "text/plain");
Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
}
if (semaphore!=null) semaphore.release();
System.out.println("Mailwriter out");
try {
sleepInterval = Integer.valueOf(DbConnection.readProperty("mailwriter_sleep")).intValue();
} catch (Exception e) {
}
mainFrame.setMailWriterState(1);
Thread.sleep(sleepInterval);
} catch (InterruptedException e) {
mainFrame.setMailWriterState(0);
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Meine Main:
PHP-Code:
Semaphore mailSemaphore = new Semaphore(1,true);
// Threads starten
MailReaderThread mailReaderThread = new MailReaderThread(this,mailSemaphore);
mailReaderThread.start();
MailWriterThread mailWriterThread = new MailWriterThread(this,mailSemaphore);
mailWriterThread.start();
Und die Console:
PHP-Code:
Mailreader in
Exception in thread "Thread-4" java.lang.SecurityException: Access to default session denied
at javax.mail.Session.getDefaultInstance(Session.java:292)
at MailWriterThread.run(MailWriterThread.java:47)
Mailwriter in
Mailreader out
Ich komme irgendwie nicht auf den Fehler!